home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 388_01 / ag / 93 / winner / ag.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-05-19  |  2.9 KB  |  308 lines

  1. #define D ++*p
  2. #define B **p
  3. #define W while
  4. #define R return 
  5. #define E else
  6. #define Q if
  7. #define G fprintf(stderr,
  8.  
  9.  
  10. #include <stdio.h>
  11.  
  12. #ifndef A
  13. #define A    512
  14. #endif
  15.  
  16. typedef int I;
  17. typedef char C;
  18. typedef void V;
  19.  
  20. I z;
  21. I f;
  22. I x;
  23. I a[A], b;
  24.  
  25.  
  26. I d[A][A];
  27. I m[A], n, o;
  28.  
  29. I N();
  30. I M();
  31. I P();
  32. I U();
  33. V X();
  34. V T();
  35. V F();
  36. V L();
  37. V O();
  38.  
  39. I
  40. main(c, p)
  41. I c;
  42. C B;
  43. {
  44.     I i;
  45.     FILE *j;
  46.     C *k, l[BUFSIZ+1];
  47.  
  48.     Q (--c < 1) {
  49.         G "usage:  ag <pattern> [js...]\n");
  50.         R 2;
  51.     }
  52.  
  53.     
  54.     N(-3);
  55.     N(-6-b);
  56.     N(0);
  57.     N(-3-b);
  58.  
  59.     X(&(*++p));
  60.  
  61.     *l = '\n';
  62.     o = 1;
  63.     i = 1;
  64.     do {
  65.         k = "-";
  66.         j = stdin;
  67.         Q (1 < c && **++p != '-') {
  68.             Q (!(j = fopen(k = *p, "r"))) {
  69.                 G 
  70.                     "ag: Failed to open '%s'.\n", k);
  71.                 i = 3;
  72.                 continue;
  73.             }
  74.         }
  75.         W (fgets(l+1, BUFSIZ, j)) {
  76.             Q (M(l)) {
  77.                 printf("%s:%s", k, l+1);
  78.                 i = 0; 
  79.             }
  80.         }
  81.         fclose(j);
  82.     } W (1 < --c);
  83.     R i;
  84. }
  85.  
  86.  
  87. V
  88. X(p)
  89. C B;
  90. {
  91.     I i, j;
  92.     i = N(-3);
  93.     T(p);
  94.     W (B == '|') {
  95.         D;
  96.         j = N(-3);
  97.         N('\n');
  98.         a[i] = -4-b;
  99.         i = N(-3);
  100.         T(p);
  101.         a[j] = -4-b;
  102.     }
  103. }
  104.  
  105.  
  106. V
  107. T(p)
  108. C B;
  109. {
  110.     W (B != '|' && (!x || B != ')')  && B)
  111.         F(p);
  112. }
  113.  
  114.  
  115. V
  116. F(p)
  117. C B;
  118. {
  119.     I i = N(-3);
  120.     Q (B == '^') {
  121.         D;
  122.         N('\n');
  123.     } E Q (B == '$') {
  124.         D;
  125.         N('\n');
  126.     } E Q (B == '(') { 
  127.         D; 
  128.         ++x;
  129.         X(p); 
  130.         Q (B != ')') { 
  131.             G "ag: Missing ')'.\n"); 
  132.             exit(3); 
  133.         }
  134.         --x;
  135.         D;
  136.     } E {
  137.         L(p);
  138.     }
  139.     Q (B == '*') {
  140.         D;
  141.         a[i] = -4-b;
  142.         N(-5-i);
  143.     } E Q (B == '?') {
  144.         D;
  145.         a[i] = -4-b;
  146.     }
  147. }
  148.  
  149.  
  150. V
  151. L(p)
  152. C B;
  153. {
  154.     I i, j;
  155.     Q (B == '.') {
  156.         N(0);
  157.     } E Q (B == '[') {
  158.         D;
  159.         i = N(-2);
  160.         Q (B == '^') {
  161.             D;
  162.             a[i] = -1;
  163.         }
  164.         Q (B == ']') {
  165.             D;
  166.             N(']');
  167.         }
  168.         W ((i = B) != ']') {
  169.             Q ((*p)[1] == '-' && i < (j = (*p)[2])) {
  170.                 W (i <= j)
  171.                     N(i++);
  172.                 *p += 3;
  173.             } E {
  174.                 N(i);
  175.                 D;
  176.             }
  177.         }
  178.         N('\n');
  179.     } E {
  180.         Q (B == '\\')
  181.             D;
  182.         N(B);
  183.     }
  184.     D;
  185. }
  186.  
  187.  
  188. I
  189. N(c)
  190. I c;
  191. {
  192.     Q (A <= b) {
  193.         G "ag: Pattern too long.\n");
  194.         exit(3);
  195.     }
  196.     a[b] = c;
  197.     R b++;
  198. }
  199.  
  200.  
  201. V
  202. O(p)
  203. I p;
  204. {
  205.     I i = n;
  206.     Q (b <= p)
  207.         R;
  208.     Q (a[p] < -2) {
  209.         Q (a[p] != -3)
  210.             O(-4-a[p]);
  211.         O(p+1);
  212.     } E Q (!a[p] || a[p] == z || P(&p)) {
  213.         
  214.         W (i < o)
  215.             Q (m[i++] == p)
  216.                 R;
  217.         
  218.         f = U(p+1);
  219.  
  220.         Q (A <= o) {
  221.             G "ag: Out of space.\n");
  222.             exit(3);
  223.         }
  224.         
  225.         m[o++] = p;
  226.     }
  227. }
  228.  
  229.  
  230. I
  231. P(p)
  232. I *p;
  233. {
  234.     I i = 0, j = 0;
  235.     Q (a[*p] == -2 || (j = a[*p] == -1)) {
  236.         W (a[D] != '\n')
  237.             Q (a[*p] == z)
  238.                 i = 1;
  239.     }
  240.     R i ^ j;
  241. }
  242.  
  243.  
  244. I
  245. U(p)
  246. I p;
  247. {
  248.     R (
  249.         f || p == b || (
  250.             a[p] < -2 && (
  251.                 (a[p] != -3 && U(-4-a[p])) 
  252.                 || U(p+1)
  253.             )
  254.         )
  255.     );
  256. }
  257.  
  258.  
  259. I
  260. M(p)
  261. C *p;
  262. {
  263.     I c, i, j, k;
  264.     f = c = 0;
  265.     W (*p && 0 <= c) {
  266.         Q (0 < (i = d[c][*p])) {
  267.             
  268.             c = i;
  269.         } E {
  270.             
  271.             z = *p;
  272.             i = d[c][0];
  273.             j = n = o;
  274.             do 
  275.                 O(m[i++]+1);
  276.             W (m[i] != 2);
  277.  
  278.             
  279.             i = k = 0;
  280.             W (i < n) {
  281.                 Q (m[i] == 2) {
  282.                     j = n;
  283.                     ++k;
  284.                 }
  285.                 Q (m[i++] == m[j]) {
  286.                     Q (o <= ++j) {
  287.                         j = n;
  288.                         Q (m[i] == 2) {
  289.                             
  290.                             o = n;
  291.                             break;
  292.                         }
  293.                     }
  294.                 } E {
  295.                     j = n;
  296.                 }
  297.             }
  298.             Q (n < o) 
  299.                 
  300.                 d[++k][0] = n;
  301.             c = d[c][*p] = f ? -1 : k;
  302.         }
  303.         ++p;
  304.     }
  305.     R c < 0;
  306. }
  307.  
  308.